package com.zhonglz.support.listener;

import java.math.BigDecimal;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import com.itextpdf.kernel.geom.Rectangle;
import com.zhonglz.support.event.SealSignDataEvent;
import com.zhonglz.support.model.SealSignData;
import com.zhonglz.util.sign.pdf.SignPdf;
import com.zhonglz.util.sign.pdf.external.ExternalSignUtils;

/***
 * 签章监听
 * @author zhonglz
 *
 */
@Component
public class SealSignListener {

	private static Logger logger = LoggerFactory.getLogger(SealSignListener.class);
	
//	@Order(40)
//    @EventListener
//    public void acceptEvent(SealSignDataEvent event) {
//		logger.info("***************签章监听开始********************");
//		SealSignData sealSignData =event.getSealSignData();
//		logger.info("签署文件宽度{},高度{}",sealSignData.getPdfWidth(),sealSignData.getPdfHeight());
//		try {
//			 /****
//			 * 签名的位置，是图章相对于pdf页面的位置坐标，原点为pdf页面左下角
//			 * setPageRect 四个参数的分别是，图章左下角x，图章左下角y，图章宽度，图章高度
//			 */
//			logger.info("盖章位置：x轴{}，y轴{}",sealSignData.getPageX(),sealSignData.getPageY());
//			//由于pdf的起始位置是左下角，所以只需要相反位置就好了
//			//y轴之所以加100px，是由于印章的范围区域一共为100px,页面计算印章位置是左上角开始算的，而itext是从左下角开始计算，所以需要把印章的区域大小也要计算进去，
//			float county = sealSignData.getPdfHeight().subtract(sealSignData.getPageY()).setScale(2, BigDecimal.ROUND_UP).floatValue()-100;
//			//页面的图片大小左右内边距各为10px，所以这里x轴需要向左偏移10px，
//			float countx = sealSignData.getPageX().setScale(2, BigDecimal.ROUND_UP).floatValue()+10;//BigDecimal转float保留两位小数  xxx.setScale(2, BigDecimal.ROUND_UP).floatValue()
//			logger.info("重新计算盖章位置：x轴{}，y轴{}",countx,county);
//			//页面上图片实际大小是80px*80px，所以这里最后两项参数直接填写80px，也可以由前端传递过来
//			Rectangle rectangle =new Rectangle(countx,county, 80, 80);
//			ExternalSignUtils externalSignUtils = new ExternalSignUtils();
//			
//		
//		} catch (Exception e) {
//			e.printStackTrace();
//			throw new RuntimeException("签章失败！");
//		}
//		logger.info("***************签章监听结束********************");
//	}
	
	
	@Order(40)
    @EventListener
    public void acceptEvent(SealSignDataEvent event) {
		logger.info("***************签章监听开始********************");
		SealSignData sealSignData =event.getSealSignData();
		logger.info("签署文件宽度{},高度{}",sealSignData.getPdfWidth(),sealSignData.getPdfHeight());
		logger.info("盖章位置：x轴{}，y轴{}",sealSignData.getPageX(),sealSignData.getPageY());
		//重新计算一下 坐标x轴，由于pdf的起始位置是左下角，所以只需要相反位置就好了
		BigDecimal county = sealSignData.getPdfHeight().subtract(sealSignData.getPageY());
		
		BigDecimal countx = sealSignData.getPageX();
		logger.info("重新计算盖章位置：x轴{}，y轴{}",countx,county);
		SignPdf sign=new SignPdf();
		try {
			sign.sign(sealSignData.getChain(), sealSignData.getPrivateKey(),
					"签名原因", "签名地点", 
					sealSignData.getSignFrontFile(),
					sealSignData.getSignBackFile(), 
					sealSignData.getSealFile(),
					sealSignData.getSignAlgorithm(),
					sealSignData.getSignPage(),
					countx, county,
					sealSignData.getPdfHeight(),
					sealSignData.getPdfWidth());
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("签章失败！");
		}
		logger.info("***************签章监听结束********************");
	}
}
